'''
Created on 14/04/2013

@author: victor
'''
from . import jsonifiedview
from flask import Flask, session, redirect, url_for, escape, request
from flask_mail import Mail, Message
from pm import app
from pm.database import db
from pm.models.Usuarios import Usuarios
from pm.views import ensureParams
from pm.views.PoseePermisosViews import obtenerPermisos
import hashlib
import random

@app.route('/cambiarpassword', methods=['GET', 'POST']) 
@jsonifiedview
def cambiarPassword():
    '''
    Intenta recuperar contrasenha a un usuario al sistema, retorna el resultado del intento!!
    '''    
    params = {'GET':request.args, 'POST':request.form}[request.method]
    if not ensureParams(params, ['id_usuario', 'password_actual', 'password_nuevo']): 
        responseToLogin = {"success" : False , "msg" : "Los parametros son insuficientes!!"}
        return responseToLogin
    try:
        id_usuario = params['id_usuario']
        passwordActual = params['password_actual']
        password_nuevo = params['password_nuevo']
        
        usuario = Usuarios.query.filter(Usuarios.id_usuario == id_usuario).one()
        password = usuario.password
        
        if(passwordActual != password):
            response = {"success" : False , "msg" : "Password incorrecto, favor intentelo de nuevo!!"}
            return response 
        try:
            if(passwordActual == password):
                usuarioPassword = Usuarios.query.filter(Usuarios.id_usuario == id_usuario).update({'password':password_nuevo})
                db.session.commit()
        except Exception, e:
            response = {"success" : False , "msg" : "Algo anda mal.. No hemos podido comunicarnos con nuestros servidores"}
            return response 
        response = {"success" : True , "msg" : "El Password ha sido modificado exitosamente!!"}
        return response 
    except Exception, e:
        response = {"success" : False , "msg" : "Algo anda mal.. No hemos podido comunicarnos con nuestros servidores"}
        return response  

@app.route('/recuperacionmail', methods=['GET', 'POST']) 
@jsonifiedview
def recuperacionMail():
    '''
    Intenta recuperar contrasenha a un usuario al sistema, retorna el resultado del intento!!
    '''    
    params = {'GET':request.args, 'POST':request.form}[request.method]
    if not ensureParams(params, ['user_name']): 
        responseToLogin = {"success" : False , "msg" : "Los parametros son insuficientes!!"}
        return responseToLogin
    try:
        username = params['user_name']
        
        usuario = Usuarios.query.filter(Usuarios.user_name == username)
        usuarioCorreo = Usuarios.query.filter(Usuarios.correo == username)
        
        if(usuario.count() == 0 and usuarioCorreo.count() == 0):
            responseToLogin = {"success" : False , "msg" : "El usuario ingresado no Existe."}
            
        if(usuario.count() != 0):
            usuarioDest = Usuarios.query.filter(Usuarios.user_name == username).one()
            nuevoPass = usuarioDest.user_name + str(random.randint(1, 1000000) * 5)
            passHash = hashlib.sha1(nuevoPass).hexdigest()
   
            usuarioAct = Usuarios.query.filter(Usuarios.user_name == username).update({'password':passHash})
            db.session.commit()
            mail = Mail(app)
            msg = Message(
                      'Restablecimiento de Password Pheta-Manager',
                   sender='phetamanager@gmail.com',
                   recipients=
                       [usuarioDest.correo])
            msg.html = "<b>Este mail fue auto-generado por Pheta-Manager Administrador de Proyectos</b>" + "<p>Su nuevo Password es: " + nuevoPass + "</p>"
            mail.send(msg)
            return {"success" : True , "msg" : "El nuevo password ha sido enviado a su correo electronico"}
        
        if(usuarioCorreo.count() != 0):
            usuarioDesti = Usuarios.query.filter(Usuarios.correo == username).one()
            nuevoPass = usuarioDesti.user_name + str(random.randint(1, 100000000) * 500)
            passHash = hashlib.sha1(nuevoPass).hexdigest()
        
            usuarioActu = Usuarios.query.filter(Usuarios.user_name == usuarioDesti.user_name).update({'password':passHash})
            db.session.commit()
            mail = Mail(app)
            msg = Message(
                      'Restablecimiento de Password Pheta-Manager',
                   sender='phetamanager@gmail.com',
                   recipients=
                       [usuarioDesti.correo])
            msg.html = "<b>Este mail fue auto-generado por Pheta-Manager Administrador de Proyectos</b>" + "<p>Su nuevo Password es: " + nuevoPass + "</p>"
            mail.send(msg)
            return {"success" : True , "msg" : "El nuevo password ha sido enviado a su correo electronico"}
        
    except Exception, e:
        response = {"success" : False , "msg" : "Algo anda mal.. No hemos podido comunicarnos con nuestros servidores"}
        return response    
    

@app.route('/login', methods=['GET', 'POST']) 
@jsonifiedview
def login():
    '''
    Intenta loguear un usuario al sistema, retorna el resultado del intento!!
    '''    
    params = {'GET':request.args, 'POST':request.form}[request.method]
    # print request.data
    responseToLogin = {}
    if(not "uid" in params or not "pwd" in params):
        responseToLogin = {"success" : False , "msg" : "Los parametros son insuficientes!!"}
    else:
        user = params["uid"]
        pasw = params["pwd"]
        
        session.pop('username', None)
        
        qu = Usuarios.query.filter(Usuarios.user_name == user)
        
        if(qu.count() == 0):
            responseToLogin = {"success" : False , "msg" : "El usuario ingresado no Existe."}
        else:
            usuarioLogueado = qu.first()
            if(usuarioLogueado.password == pasw):
                resp = obtenerPermisos(user)
                session['username'] = usuarioLogueado.user_name
                session['id_usuario'] = usuarioLogueado.id_usuario
                session['uid'] = usuarioLogueado.user_name
                session['proyectos'] = {}
                session['fases'] = {}
                session['permisos'] = resp
                responseToLogin = {"success" : True , "msg" : usuarioLogueado.nombre + " " + usuarioLogueado.apellido, 'url': '/static/menuprincipal/app.html', 'permisos':resp, 'user':user, 'id_usuario':usuarioLogueado.id_usuario}
            else:
                responseToLogin = {"success" : False , "msg" : "No se puede determinar que las credenciales proporcionadas sean autenticas!!"}

    return responseToLogin

def islogged():
    return 'username' in session    
    
@app.route('/islogged', methods=['GET', 'POST'])
@jsonifiedview
def isloggedv():
    return islogged()



    '''
    retorna los permisos que tiene un determinado usuario
    ''' 
@app.route('/getpermisos', methods=['GET', 'POST'])
@jsonifiedview
def getPermisos():
    resp = obtenerPermisos(session['username'])
    responseToLogin = {"success" : True, 'permisos':resp}
    return responseToLogin


@app.route('/getusuario', methods=['GET', 'POST'])
@jsonifiedview
def getUsuario():
    responseToLogin = {"success" : True, 'username':(session['username'])}
    return responseToLogin

    '''
    metodo invocado para desloguearse
    ''' 

@app.route('/logout', methods=['GET', 'POST'])
@jsonifiedview
def logout():
    session.pop('username', None)
    session.pop('uid', None)
    return {'success':True, 'url':'/static/login/app.html'}
